#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 5  // 队列最大容量（实际可用MAXSIZE-1，预留1个位置区分空满）
typedef int ElemType;
typedef int Status;

// 循环队列结构体
typedef struct {
    ElemType data[MAXSIZE];
    int front;  // 队头指针（指向队头元素的前一个位置）
    int rear;   // 队尾指针（指向队尾元素）
} CircularQueue;

// 初始化队列
Status InitQueue(CircularQueue *Q) {
    Q->front = Q->rear = 0;
    return OK;
}

// 判断队列是否为空
Status IsEmpty(CircularQueue *Q) {
    return (Q->front == Q->rear) ? OK : ERROR;
}

// 判断队列是否已满（预留1个位置，队尾的下一个是队头则满）
Status IsFull(CircularQueue *Q) {
    return ((Q->rear + 1) % MAXSIZE == Q->front) ? OK : ERROR;
}

// 入队（队尾插入，循环移动）
Status EnQueue(CircularQueue *Q, ElemType e) {
    if (IsFull(Q)) return ERROR;
    Q->rear = (Q->rear + 1) % MAXSIZE;  // 队尾指针循环后移
    Q->data[Q->rear] = e;               // 存入元素
    return OK;
}

// 出队（队头删除，循环移动）
Status DeQueue(CircularQueue *Q, ElemType *e) {
    if (IsEmpty(Q)) return ERROR;
    Q->front = (Q->front + 1) % MAXSIZE;  // 队头指针循环后移
    *e = Q->data[Q->front];               // 取出元素
    return OK;
}

// 打印队列
void PrintQueue(CircularQueue *Q) {
    if (IsEmpty(Q)) {
        printf("队列为空\n");
        return;
    }
    printf("队列元素：");
    int i = (Q->front + 1) % MAXSIZE;  // 从队头元素开始
    while (i != (Q->rear + 1) % MAXSIZE) {  // 循环遍历到队尾
        printf("%d ", Q->data[i]);
        i = (i + 1) % MAXSIZE;
    }
    printf("\n");
}

// 测试
int main() {
    CircularQueue Q;
    InitQueue(&Q);
    EnQueue(&Q, 1);
    EnQueue(&Q, 2);
    EnQueue(&Q, 3);
    EnQueue(&Q, 4);
    PrintQueue(&Q);  // 1 2 3 4（此时队列已满，MAXSIZE=5，可用4个位置）

    int e;
    DeQueue(&Q, &e);  // 出队1
    PrintQueue(&Q);  // 2 3 4

    EnQueue(&Q, 5);  // 可入队（队尾绕回数组开头）
    PrintQueue(&Q);  // 2 3 4 5
    return 0;
}